package com.yingxin.yxerp.module.organization.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.taobao.api.ApiException;
import com.yingxin.yx.framework.user.dto.AppPermissionDto;
import com.yingxin.yx.framework.user.dto.PermissionDto;
import com.yingxin.yxerp.module.organization.entity.User;
import com.yingxin.yxerp.module.organization.mapper.UserMapper;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 用户 服务类
 * @author fanchao
 * @since 2021-05-13
 */

public interface IUserService extends IService<User> {

    /**
     * 获取 mapper
     */
    UserMapper mapper();

    List<User> listByIds(Set<String> ids);

    List<User> listByIds(List<String> ids);

    String getStaffNameById(String id);

    /**
     * 根据 deptId 查询
     */
    List<User> listByDeptId(String deptId);

    /**
     * 根据 deptId 查询
     */
    List<User> listByDeptIds(String deptId);

    /**
     * 部门员工计数
     */
    Integer countByDeptId(String deptId);

    /**
     * 根据用户名查询
     */
    User getByUsername(String username);

    /**
     * 根据电话查询
     */
    User getByPhone(String phone);

    /**
     * 根据微信OpenId查询
     */
    User getByWechatOpenId(String openId);

    /**
     * 微信绑定
     */
    void bindWechat(String userId, String openId, String nickname);

    /**
     * 微信绑定2
     */
    void bindWechatInfo(String userId, String openId, String nickname, String wechatAvatarUrl);

    /**
     * 解绑微信
     */
    Boolean unboundWechat();

    /**
     * 当前最大工号
     * @return
     */
    Integer getMaxStaffNo();

    /**
     * 创建用户
     */
    void create(User user);

    /**
     * 修改用户
     */
    void update(User user);

    /**
     * 同步用户
     */
    void synchronousUpdate(User user);

    /**
     * 修改用户
     */
    void updateAvatar(User user);

    void userEdit(User user, String username, String password, String accountRemarks);

    /**
     * 启用用户
     */
    void enable(User user);

    /**
     * 禁用用户
     */
    void disable(User user);

    void lock(String username);

    void unlock(User user);

    /**
     * 删除用户
     */
    void delete(User user);

    /**
     * 添加角色
     */
    void addRoles(String userId, List<String> roleIds);

    /**
     * app添加角色
     */
    void addAppRoles(String userId, List<String> roleIds);

    void saveHomeModules(String userId, List<String> modules);

    /**
     * 根据用户id获取菜单权限
     */
    List<PermissionDto> listPermissionDtoByUserId(String userId);

    /**
     * 根据用户id获取app菜单权限
     */
    List<AppPermissionDto> listAppPermissionDtoByUserId(String userId);

    void checkUsername(String userId, String username);

    /**
     * pc端修改密码
     * @param user 用户对象
     * @param password 新密码
     * @param confirmPassword 确认密码
     * @param oldPassword 旧密码
     */
    void modifyPassword(User user, String password, String confirmPassword, String oldPassword);

    /**
     * app修改密码
     * @param user 用户对象
     * @param password 新密码
     * @param confirmPassword 确认密码
     * @param oldPassword 旧密码
     */
    void appModifyPassword(User user, String password, String confirmPassword, String oldPassword);

    /**
     * 管理员修改PC密码
     * @param password 新密码
     * @param confirmPassword 确认密码
     */
    void adminPcModifyPassword(String userId, String password, String confirmPassword);

    /**
     * 管理员修改app密码
     * @param password 新密码
     * @param confirmPassword 确认密码
     */
    void adminAppModifyPassword(String userId, String password, String confirmPassword);

    /**
     * 根据用户id获取首页自定义模块
     */
    List<String> listHomeWorkbenchModulesByUserId(String userId);

    /**
     * 微信解绑
     */
    boolean wechatOnlineTranslation(String userId);

    /**
     * 开通和关闭App登录
     */
    void isOpenAppLogon(String userId);

    /**
     * 同步员工档案 - 钉钉
     */
    void synchronism() throws ApiException, IllegalAccessException;

    /**
     * 同步员工档案 - 企业微信
     */
    void synchronismWeCom();

    /**
     * 同步离职员工档案
     */
    void departSynchronism() throws Exception;

    /**
     * 查找 ding_user_id 是否存在
     */
    List<User> checkIsDingUserId(String dingUserId);

    /**
     * 查找 we_com_user_id 是否存在
     */
    List<User> checkIsWeComUserId(String weComUserId);

    /**
     * 获取dinguserid 的员工，否则获取证件编号的员工
     */
    List<User> getDingUserIdOrIdCardNo(String dingUserId, String idCardNo);

    Map<String,String> viewPassword();

    /**
     * 根据身份证号码获取
     */
    User getByIdCardNo( String idCardNo );

    /**
     * 创建流程验证 用户 和 部门
     * @param userId
     * @return
     */
    Map<String,Object> createVariables(String userId);

}
